/*****************************************************************************/
// modified by Be Nanashi-san 2009
//
/*****************************************************************************/

/*****************************************************************************/
// ShowImageSettings
// Written by Michael Pfeiffer
//
// ShowImageSettings.cpp
//
//
// Copyright (c) 2003 OpenBeOS Project
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense, 
// and/or sell copies of the Software, and to permit persons to whom the 
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included 
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
/*****************************************************************************/

#include <File.h>
#include "TSettings.h"
#include "setting.h"
#include <stdio.h>

TSettings &
theSettings()
{
	static TSettings s(kSETTING_FILE);
	return s;
}

////////////////////////////////////////////////////////////////////////////////
// TSettings
//
//
////////////////////////////////////////////////////////////////////////////////
TSettings::TSettings(const char *path)
{
	this->SetPath(path);	
}

////////////////////////////////////////////////////////////////////////////////
// ~TSettings
//
//
////////////////////////////////////////////////////////////////////////////////
TSettings::~TSettings()
{
	this->Save();
//	theSettings = NULL;
}
////////////////////////////////////////////////////////////////////////////////
// SetPath
//
//
////////////////////////////////////////////////////////////////////////////////
void
TSettings::SetPath(const char *path)
{
	fPath.SetTo(path);
}
////////////////////////////////////////////////////////////////////////////////
// Lock
//
//
////////////////////////////////////////////////////////////////////////////////
bool
TSettings::Lock()
{
	return fLock.Lock();
}
////////////////////////////////////////////////////////////////////////////////
// Unlock
//
//
////////////////////////////////////////////////////////////////////////////////
void
TSettings::Unlock()
{
	fLock.Unlock();
}
////////////////////////////////////////////////////////////////////////////////
// GetBool
//
// 20060415 syuusei
////////////////////////////////////////////////////////////////////////////////
bool
TSettings::GetBool(const char* name)
{
	bool value;
	if (fSettings.FindBool(name, &value) == B_OK) {
		return value;
	} else {
		debugger("no bool data");
		return false;
	}
}
////////////////////////////////////////////////////////////////////////////////
// GetInt32
//
//
////////////////////////////////////////////////////////////////////////////////
int32 
TSettings::GetInt32(const char* name, int32 defaultValue)
{
	int32 value;
	if (fSettings.FindInt32(name, &value) == B_OK) {
		return value;
	} else {
		return defaultValue;
	}
}
////////////////////////////////////////////////////////////////////////////////
// GetFloat
//
//
////////////////////////////////////////////////////////////////////////////////
float 
TSettings::GetFloat(const char* name, float defaultValue)
{
	float value;
	if (fSettings.FindFloat(name, &value) == B_OK) {
		return value;
	} else {
		return defaultValue;
	}
}
////////////////////////////////////////////////////////////////////////////////
// GetRect
//
//
////////////////////////////////////////////////////////////////////////////////
BRect
TSettings::GetRect(const char* name)
{
	BRect value;
	fSettings.FindRect(name, &value);
	return value;
}
////////////////////////////////////////////////////////////////////////////////
// GetPoint
//
//
////////////////////////////////////////////////////////////////////////////////
status_t
TSettings::GetPoint(const char* name, BPoint *point)
{
	return fSettings.FindPoint(name, point);
}
////////////////////////////////////////////////////////////////////////////////
// GetPoint
//
//
////////////////////////////////////////////////////////////////////////////////
BPoint
TSettings::GetPoint(const char* name)
{
	BPoint value;
	fSettings.FindPoint(name, &value);
	return value;
}
////////////////////////////////////////////////////////////////////////////////
// GetString
//
//
////////////////////////////////////////////////////////////////////////////////
const char*
TSettings::GetString(const char* name, const char* defaultValue)
{
	const char* value;
	if (fSettings.FindString(name, &value) == B_OK) {
		return value;
	} else {
		return defaultValue;
	}
}
////////////////////////////////////////////////////////////////////////////////
// GetString
//
//
////////////////////////////////////////////////////////////////////////////////
const char*
TSettings::GetString(const char* name)
{
	const char* value;
	if (fSettings.FindString(name, &value) == B_OK) {
		return value;
	} else {
		return NULL;
	}
}
////////////////////////////////////////////////////////////////////////////////
// GetMessage
//
//
////////////////////////////////////////////////////////////////////////////////
status_t
TSettings::GetMessage(const char* name, BMessage* msg)
{
	return fSettings.FindMessage(name, msg);
}
////////////////////////////////////////////////////////////////////////////////
// SetBool
//
//
////////////////////////////////////////////////////////////////////////////////
void
TSettings::SetBool(const char* name, bool value)
{
	if (fSettings.HasBool(name)) {
		fSettings.ReplaceBool(name, value);
	} else {
		fSettings.AddBool(name, value);
	}
}
////////////////////////////////////////////////////////////////////////////////
// SetInt32
//
//
////////////////////////////////////////////////////////////////////////////////
void
TSettings::SetInt32(const char* name, int32 value)
{
	if (fSettings.HasInt32(name)) {
		fSettings.ReplaceInt32(name, value);
	} else {
		fSettings.AddInt32(name, value);
	}
}
////////////////////////////////////////////////////////////////////////////////
// SetFloat
//
//
////////////////////////////////////////////////////////////////////////////////
void
TSettings::SetFloat(const char* name, float value)
{
	if (fSettings.HasFloat(name)) {
		fSettings.ReplaceFloat(name, value);
	} else {
		fSettings.AddFloat(name, value);
	}
}
////////////////////////////////////////////////////////////////////////////////
// SetPoint
//
//
////////////////////////////////////////////////////////////////////////////////
void
TSettings::SetPoint(const char* name, BPoint point)
{
	if (fSettings.HasPoint(name)) {
		fSettings.ReplacePoint(name, point);
	} else {
		fSettings.AddPoint(name, point);
	}
}
////////////////////////////////////////////////////////////////////////////////
// SetRect
//
//
////////////////////////////////////////////////////////////////////////////////
void
TSettings::SetRect(const char* name, BRect value)
{
	if (fSettings.HasRect(name)) {
		fSettings.ReplaceRect(name, value);
	} else {
		fSettings.AddRect(name, value);
	}
}
////////////////////////////////////////////////////////////////////////////////
// SetString
//
//
////////////////////////////////////////////////////////////////////////////////
void
TSettings::SetString(const char* name, const char* value)
{
	if (fSettings.HasString(name)) {
		fSettings.ReplaceString(name, value);
	} else {
		fSettings.AddString(name, value);
	}
}
////////////////////////////////////////////////////////////////////////////////
// SetMessage
//
//
////////////////////////////////////////////////////////////////////////////////
void
TSettings::SetMessage(const char* name, BMessage* value)
{
	if (fSettings.HasMessage(name)) {
		fSettings.ReplaceMessage(name, value);
	} else {
		fSettings.AddMessage(name, value);
	}
}
////////////////////////////////////////////////////////////////////////////////
// OpenSettingsFile
//
//
////////////////////////////////////////////////////////////////////////////////
status_t
TSettings::OpenSettingsFile(BFile* file, bool forReading)
{
	uint32 openMode;
	
	if (forReading) {
		openMode = B_READ_ONLY;
	} else {
		openMode = B_WRITE_ONLY | B_CREATE_FILE | B_ERASE_FILE;
	}
	return file->SetTo(fPath.String(), openMode);
}
////////////////////////////////////////////////////////////////////////////////
// Load
//
//
////////////////////////////////////////////////////////////////////////////////
status_t
TSettings::Load()
{
	BFile file;
	if (OpenSettingsFile(&file, true) == B_OK) {
		fSettings.Unflatten(&file);
		return B_OK;
	}

	return B_ERROR;
}
////////////////////////////////////////////////////////////////////////////////
// Save
//
//
////////////////////////////////////////////////////////////////////////////////
void
TSettings::Save()
{
	if (this->Lock()) {
		BFile file;
		if (OpenSettingsFile(&file, false) == B_OK) {
			fSettings.Flatten(&file);
		}
		this->Unlock();
	}
}

////////////////////////////////////////////////////////////////////////////////
// Clear
//
//
////////////////////////////////////////////////////////////////////////////////
void
TSettings::Clear()
{
	if (this->Lock()) {
		fSettings.MakeEmpty();
		this->Unlock();
	}
}
////////////////////////////////////////////////////////////////////////////////
// SetTo
//
//
////////////////////////////////////////////////////////////////////////////////
void
TSettings::SetTo(BMessage &msg)
{
	if (this->Lock()) {
		fSettings = msg;
		this->Unlock();
	}
}

////////////////////////////////////////////////////////////////////////////////
// MakeCopy
//
//
////////////////////////////////////////////////////////////////////////////////
void
TSettings::MakeCopy(BMessage &m)
{
	if (this->Lock()) {
		m = fSettings;
		this->Unlock();
	}
}

////////////////////////////////////////////////////////////////////////////////
// Settings
//
// 20060717:BeOS - Zeta R5スレの311@Be名無しさんより、lock削除。
////////////////////////////////////////////////////////////////////////////////
BMessage *
TSettings::Settings()
{
	return &fSettings;
}


